package sifeap.pl.managedbean.eventos;

import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import sifeap.bl.ejb.eventos.EventoBLLocal;
import sifeap.entities.eventos.Evento;
import sifeap.entities.eventos.valueobject.EventoVO;
import sifeap.entities.usuarios.valueobject.UsuarioVO;
import sifeap.exception.SifeapException;
import sifeap.pl.managedbean.usuarios.LoginManagedBean;
import sifeap.pl.util.FacesUtils;

@ManagedBean(name="eventosManagedBean")
@SessionScoped
public class EventosManagedBean {
	
	//Propiedades del Managed Bean
	private Long idEvento;
	private String nombre;
	private String descripcion;
	private Date inicioVigencia;
	private Date finVigencia;
	private Date fechaEvento;
	private Date horaEvento;
	
	private List<Evento> listaEventos;
	
	private int accion;
	
	private final String MENSAJES_BUNDLE = "sifeap.pl.bundles.mensajes";
	
	@EJB
	private EventoBLLocal eventoBL;
	
	@PostConstruct
	public void inicializar() {
		buscarTodos();
	}
	
	public Long getIdEvento() {
		return idEvento;
	}

	public void setIdEvento(Long idEvento) {
		this.idEvento = idEvento;
	}

	/***************Getters y Setters***************/
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public String getDescripcion() {
		return descripcion;
	}
	
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	
	public Date getInicioVigencia() {
		return inicioVigencia;
	}
	
	public void setInicioVigencia(Date inicioVigencia) {
		this.inicioVigencia = inicioVigencia;
	}
	
	public Date getFinVigencia() {
		return finVigencia;
	}
	
	public void setFinVigencia(Date finVigencia) {
		this.finVigencia = finVigencia;
	}
	
	public Date getFechaEvento() {
		return fechaEvento;
	}

	public void setFechaEvento(Date fechaEvento) {
		this.fechaEvento = fechaEvento;
	}

	public Date getHoraEvento() {
		return horaEvento;
	}
	
	public void setHoraEvento(Date horaEvento) {
		this.horaEvento = horaEvento;
	}
	
	public List<Evento> getListaEventos() {
		return listaEventos;
	}

	public void setListaEventos(List<Evento> listaEventos) {
		this.listaEventos = listaEventos;
	}
	
	public Boolean getMostrarResultados() {
		if (listaEventos != null && listaEventos.size() > 0) {
			return true;
		} else {
			return false;
		}
	}

	public int getAccion() {
		return accion;
	}

	public void setAccion(int accion) {
		this.accion = accion;
	}

	/***********************************************/
	
	public void guardar() {
		try {
			Evento evento;
			
			if (getAccion() == EventoVO.ACCION_MODIFICAR) {
				evento = eventoBL.buscar(getIdEvento());
			} else {
				evento = new Evento();
			}
			
			evento.setNombre(getNombre());
			evento.setDescripcion(getDescripcion());
			evento.setInicioVigencia(getInicioVigencia());
			evento.setFinVigencia(getFinVigencia());
			evento.setFechaEvento(getFechaEvento());
			evento.setHoraEvento(getHoraEvento());
			
			//Obtiene el usuario de la sesion
			UsuarioVO usuario = (UsuarioVO) FacesUtils.getSessionAttribute(LoginManagedBean.USER_LOGIN);
			evento.setUsuario(usuario.getUsuario());
		
			byte resultado;
			
			if (getAccion() == EventoVO.ACCION_MODIFICAR) {
				resultado = eventoBL.modificar(evento);
			} else {
				resultado = eventoBL.crear(evento);
			}
			
			switch (resultado) {
				case 1:
					//Exitoso
					buscarTodos();
					
					if (getAccion() == EventoVO.ACCION_MODIFICAR) {
						FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.eventos.modificar.exito"), false);
					} else {
						FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.eventos.crear.exito"), false);
					}
					
					limpiarCampos();
					break;
				case 2:
					//Fecha inicio y fin incorrectas
					FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.eventos.fechasvigencia.error"), false);
					break;
				case 3:
					//Fecha evento incorrecta
					FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.eventos.fechaevento.error"), false);
					break;
				default:
					break;
			}
		} catch (Exception e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.eventos.crear.error"), false);
			} catch (SifeapException e1) {}
			e.printStackTrace();
		}
	}
	
	public void cargarEditar() {
		String idEvento = FacesUtils.getRequestParameter("p_idevento_edit");
		
		if (idEvento != null) {
			setAccion(EventoVO.ACCION_MODIFICAR);
			
			try {
				setIdEvento(new Long(idEvento));
				
				Evento evento = eventoBL.buscar(getIdEvento());
				
				setNombre(evento.getNombre());
				setDescripcion(evento.getDescripcion());
				setInicioVigencia(evento.getInicioVigencia());
				setFinVigencia(evento.getFinVigencia());
				setFechaEvento(evento.getFechaEvento());
				setHoraEvento(evento.getHoraEvento());
				
				
			} catch (NumberFormatException e) {
				e.printStackTrace();
			} catch (SifeapException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void cargarEliminar() {
		String idEvento = FacesUtils.getRequestParameter("p_idevento_elim");
		if (idEvento != null) {
			setIdEvento(new Long(idEvento));
		}
	}
	
	public void eliminar() {
		try {
			Evento evento = eventoBL.buscar(getIdEvento());
			eventoBL.eliminar(evento);
			
			buscarTodos();
			limpiarCampos();
			
			FacesUtils.addInfoMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.eventos.eliminar.exito"), false);
		} catch (Exception e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.eventos.eliminar.error"), false);
			} catch (Exception ex) {}
		}
	}

	public String limpiar() {
		limpiarCampos();
		return "/web/eventos/eventos.jsf?faces-redirect=true";
	}
	
	public String cancelar() {
		if(getAccion() == EventoVO.ACCION_MODIFICAR) {
			limpiarCampos();
		} else {
			setAccion(EventoVO.ACCION_CREAR);
			setIdEvento(null);
		}
		return "/web/eventos/eventos.jsf?faces-redirect=true";
	}
	
	private void limpiarCampos() {
		setAccion(EventoVO.ACCION_CREAR);
		setIdEvento(null);
		setNombre(null);
		setDescripcion("");
		setInicioVigencia(null);
		setFinVigencia(null);
		setFechaEvento(null);
		setHoraEvento(null);
	}
	
	private void buscarTodos() {
		try {
			listaEventos = eventoBL.buscarTodos();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Verifica si para el usuario autenticado tiene los permisos solicitados
	 * @return
	 */
	public boolean isTienePermisos() {
		return LoginManagedBean.tienePermisos("admon_eventos:consultar","admon_eventos:crear");
	}
}